js 闭包

一、闭包

1.1、概括

闭包就是指有权访问另一个函数作用域中的变量的函数。

1.2、如何创建

创建闭包的常见方式,就是在一个函数内部创建另一个函数。

1.3、例子

​ 就是说当一个函数执行的时候,可以让自己内部的变量不受外部的影响,然后会存在一个返回值,一般是一个函数,并且在该函数里面引用局部变量信息。然后在函数执行完毕后,这个局部变量信息不会消失,而是长时间的驻扎在内存里面的这种机制被称为’闭包’。

1.4、作用

①、闭包会构成一个封闭的结构,可以避免全局变量的污染;

②、闭包可以读取到函数内部的变量;

③、闭包可以让变量的值保持在内存中;

1.5、坏处

​ 闭包会携带包含它的函数的作用域,因此会比其它函数占用更多的内存。过度使用闭包可能会导致内存占用过多。

​ 在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。就是将其设置为null;

1.6、实际应用场景

封装插件

1.7、code

1
2
3
4
5
6
// 创建函数
var compareNames = createComparisonFunction("name");
// 调用函数
var result = compareNames({ name: "Nicholas" }, { name: "Greg" });
// 解除对匿名函数的引用(以便释放内存)
compareNames = null;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
var a = 10000;
function test() {
// 此处的变量 a 并不受其它作用域的影响
var a = 200;
return function() {
return a;
}
}
// 此处的 test 函数执行完毕之后并不能被 JS 垃圾回收机制(GC)回收,因为它的局部变量 a 被 fn 所引用
var fn = test();
console.log(fn());

// 返回对象而不是函数同样可以达到闭包效果
var a = 10000;
function test() {
// 此处的变量 a 并不受其它作用域的影响
var a = 200;
return { 'param' : a };
}
// 此处的 test 函数执行完毕之后并不能被 JS 垃圾回收机制(GC)回收,因为它的局部变量 a 被 obj 所引用
var obj = test();
console.log(obj.param);

没有返回值,依然构成闭包

1
2
3
4
5
6
(function(window,$) {
var count = 0;
$('#btn').click(function(event) {
$('#count').html(++count);
})
})(window,$)
本文结束,感谢您的阅读